package com.inight.nightojbackendcommon.utils.easyexcel;


/**
 * 读的监听器
 * 实现， 就是去遵循别人的规范
 */

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.excel.util.ListUtils;
import com.alibaba.excel.write.metadata.WriteSheet;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;

@Slf4j
public class DcydListener implements ReadListener<Dcyd> {

    private static final List<FinishDcyd> finishDcydList = new ArrayList<>();

    /**
     * 每隔5条存储数据库，实际使用中可以100条，然后清理list ，方便内存回收
     */
    private static final int BATCH_COUNT = 100;
    /**
     * 缓存的数据
     */
    private List<FinishDcyd> cachedDataList = ListUtils.newArrayListWithExpectedSize(BATCH_COUNT);
    /**
     * 假设这个是一个DAO，当然有业务逻辑这个也可以是一个service。当然如果不用存储这个对象没用。 还需要编写 dao层
     */
    /*private DemoDAO demoDAO;

    public DemoDataListener() {
        // 这里是demo，所以随便new一个。实际使用如果到了spring,请使用下面的有参构造函数
        demoDAO = new DemoDAO();
    }*/

    /**
     * 每次读取一条数据， 都会调用这个方法， 可以处理数据
     * @param dcyd
     * @param context
     */
    @Override
    public void invoke(Dcyd dcyd, AnalysisContext context) {
        // 1. 解析数据
        FinishDcyd finishDcyd = new FinishDcyd();
        BeanUtils.copyProperties(dcyd, finishDcyd);

        // SRID=4528;POINT(120.053841 36.477959)
        StringBuffer sb = new StringBuffer();
        sb.append("SRID=4528;POINT("  + formatDecimalString(dcyd.getJD(), 6) + " " + formatDecimalString(dcyd.getWD(), 6) + ")");
        finishDcyd.setGeom(sb.toString());
        // finishDcyd.setId();
        // 0-表层，  1-剖面
        finishDcyd.setVerify("0");
        finishDcyd.setYDBH(dcyd.getYDBM());

        // 2. 批量保存到数据库或者导出到表格中
        /*cachedDataList.add(finishDcyd);
        if(cachedDataList.size() >= BATCH_COUNT) {
            // todo 批量保存到数据库
            // 重置 list
            cachedDataList = new ArrayList<FinishDcyd>(BATCH_COUNT);
        }*/
        // 保存到一个 list 中， 进行写入到表格中
        finishDcydList.add(finishDcyd);

    }


    public static String formatDecimalString(String decimalStr, int count) {
        // 检查字符串是否为空或null
        if (decimalStr == null || decimalStr.isEmpty()) {
            return decimalStr;
        }
        // 尝试将字符串转换为BigDecimal，如果失败（比如包含非数字字符），则直接返回原字符串
        try {
            BigDecimal decimal = new BigDecimal(decimalStr);
            // 保留六位小数，使用四舍五入模式
            BigDecimal formattedDecimal = decimal.setScale(count, RoundingMode.HALF_UP);
            // 转换为字符串并返回
            return formattedDecimal.toString();
        } catch (NumberFormatException e) {
            // 如果字符串不能转换为BigDecimal，则返回原字符串
            return decimalStr;
        }
    }


    /**
     * 所有数据解析完成了 都会来调用
     * 处理完之后， 写入到表格中去. 重复多次写
     *
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {

        // 方法1: 如果写到同一个sheet
        // String fileName = TestFileUtil.getPath() + "repeatedWrite" + System.currentTimeMillis() + ".xlsx";
        // 第二次写到同一个表格会覆盖第一次表格的结果
        String fileName = "D:\\finishDcyd2.xlsx";
        // 这里 需要指定写用哪个class去写.
        // write 方法返回的是 ExcelWriteBuilder. 理解为 构建者, .build() 才是构建出 ExcelWrite.
        try (ExcelWriter excelWriter = EasyExcel.write(fileName, FinishDcyd.class).build()) {
            // 这里注意 如果同一个sheet只要创建一次
            WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
            // 去调用写入,这里我调用了五次，实际使用时根据数据库分页的总的页数来
            /*for (int i = 0; i < 5; i++) {
                // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
                List<FinishDcyd> data = data();
                excelWriter.write(data, writeSheet);
            }*/
            // 写入到表格中去
            excelWriter.write(finishDcydList, writeSheet);
        }
    }
}
